package com.gj.demojuc.chap07;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author gengjian
 * @date 2025/01/10 22:37:22
 * 阻塞队列  先进先出
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        //创建有界阻塞队列对象
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
        //4种操作队列方法
        //抛异常 add remove element
//        System.out.println(queue.add("a"));//正常返回true
//        System.out.println(queue.add("b"));
//        System.out.println(queue.add("c"));
////        System.out.println(queue.add("d"));//队列已满，入队抛出illegalStateException异常
//        System.out.println(queue.element());//获取第一个入队元素
//        System.out.println(queue.remove());//移除第一个元素 返回出队元素
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
////        System.out.println(queue.remove());//队列为空，移除抛出nosuchElementexception异常
//        System.out.println(queue.element());//队列为空，查元素抛出nosuchElementexception异常
        //特殊返回值 offer poll peek
//        System.out.println(queue.offer("a"));//入队返回true
//        System.out.println(queue.offer("b"));
//        System.out.println(queue.offer("c"));
//        System.out.println(queue.offer("d"));//队满false
//        System.out.println(queue.peek());//取队头元素
//        System.out.println(queue.poll());//出队第一个元素并返回
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.peek());//队空，返回null
//        System.out.println(queue.poll());//队空，返回null
        //阻塞put take 没有阻塞查
//        queue.put("a");//入队
//        queue.put("b");
//        queue.put("c");
//        System.out.println(queue.take());//出队第一个元素，返回出队元素，则后面代码不会阻塞
//        queue.put("d");//队满阻塞
//        System.out.println(queue.take());//出队第一个元素并返回
//        System.out.println(queue.take());
//        System.out.println(queue.take());
//        System.out.println(queue.take());//队空仍出队 阻塞
        //超时offer(e time unit) poll(time unit) 阻塞的情况下有等待时间 超出则false
        System.out.println(queue.offer("a"));
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        System.out.println(queue.offer("d",5, TimeUnit.SECONDS));//阻塞五秒后返回false
        System.out.println(queue.poll());//出队第一个元素,返回出队元素
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll(5,TimeUnit.SECONDS));//队空出队超时返回null
    }
}
